package own.stu.jobgib.playown.alg.leetcode.editor.cn;

//给你一个 m x n 的字符矩阵 box ，它表示一个箱子的侧视图。箱子的每一个格子可能为： 
//
// 
// '#' 表示石头 
// '*' 表示固定的障碍物 
// '.' 表示空位置 
// 
//
// 这个箱子被 顺时针旋转 90 度 ，由于重力原因，部分石头的位置会发生改变。每个石头会垂直掉落，直到它遇到障碍物，另一个石头或者箱子的底部。重力 不会 影
//响障碍物的位置，同时箱子旋转不会产生惯性 ，也就是说石头的水平位置不会发生改变。 
//
// 题目保证初始时 box 中的石头要么在一个障碍物上，要么在另一个石头上，要么在箱子的底部。 
//
// 请你返回一个 n x m的矩阵，表示按照上述旋转后，箱子内的结果。 
//
// 
//
// 示例 1： 
//
// 
//
// 输入：box = [["#",".","#"]]
//输出：[["."],
//      ["#"],
//      ["#"]]
// 
//
// 示例 2： 
//
// 
//
// 输入：box = [["#",".","*","."],
//            ["#","#","*","."]]
//输出：[["#","."],
//      ["#","#"],
//      ["*","*"],
//      [".","."]]
// 
//
// 示例 3： 
//
// 
//
// 输入：box = [["#","#","*",".","*","."],
//            ["#","#","#","*",".","."],
//            ["#","#","#",".","#","."]]
//输出：[[".","#","#"],
//      [".","#","#"],
//      ["#","#","*"],
//      ["#","*","."],
//      ["#",".","*"],
//      ["#",".","."]]
// 
//
// 
//
// 提示： 
//
// 
// m == box.length 
// n == box[i].length 
// 1 <= m, n <= 500 
// box[i][j] 只可能是 '#' ，'*' 或者 '.' 。 
// 
// Related Topics 数组 双指针 
// 👍 2 👎 0


public class RotatingTheBox {
    public static void main(String[] args) {
        Solution solution = new RotatingTheBox().new Solution();
//        char[] box = {'#','#','#','.','#','.'};
//        char[] box = {'#','#','#','*','.','.'};
//        char[] box = {'#','#','*','.','*','.'};
//        char[] box = {'*','#','*','.','.','.','#','.','*','.'};
//        solution.change(box, box.length);
//        System.out.println(box);

        /*char[][] chars = solution.rotateTheBox(new char[][]{
                {'#', '#', '*', '.', '*', '.'},
                {'#', '#', '#', '*', '.', '.'},
                {'#', '#', '#', '.', '#', '.'}
        });*/

        /*char[][] chars = solution.rotateTheBox(new char[][]{
                {'#','.','*','.'},
                {'#','#','*','.'}
        });*/

        /*char[][] chars = solution.rotateTheBox(new char[][]{
                {'#','.','#'}
        });
//        System.out.println(chars);
        for(char[] c : chars)
            System.out.println(c);*/
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        private char ROCK = '#';
        private char BARRIER = '*';
        private char EMPTY = '.';

        public char[][] rotateTheBox(char[][] box) {
            if (box == null || box.length == 0 || box[0].length == 0) {
                return box;
            }
            int row = box.length;
            int col = box[0].length;

            char[][] ans = new char[col][row];

            // change first
            for(int i = 0; i < row; i ++)
                change(box[i], col);

            // rotate second
            for(int i = 0; i < row; i ++){
                for(int j = 0; j < col; j ++)
                    ans[j][row - i - 1] = box[i][j];
            }

            return ans;
        }

        private void change(char[] box, int len) {
            int i = len - 1;
            int j = len - 1;
            for (; i >= 0; i--) {
                if(box[i] == BARRIER){
                    j = i - 1;
                    continue;
                }

                if(box[i] == EMPTY){
                    continue;
                }

                if(box[i] == ROCK){
                    if(j != i) {
                        box[j--] = box[i];
                        box[i] = EMPTY;
                    }else {
                        j--;
                    }
                }
            }
            /*for(; j >= 0;j --){
                box[j] = EMPTY;
            }*/
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}
